from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
from common.utils import get_asyncdb_url
from sqlalchemy import Column, Integer, Text, String

# 创建异步Engine用于FastAPI的异步操作
async_engine = create_async_engine(
    get_asyncdb_url("factordb"), # 连接factordb数据库
    # 将输出所有执行SQL的日志（默认是关闭的）
    echo=False,
    # 连接池大小（默认是5个）
    pool_size=10,
    # 允许连接池最大的连接数（默认是10个）
    max_overflow=20,
    # 获得连接超时时间（默认是30s）
    pool_timeout=10,
    # 连接回收时间（默认是-1，代表永不回收）
    pool_recycle=3600,
    # 连接前是否预检查（默认为False）
    pool_pre_ping=True,
)


AsyncSessionFactory = sessionmaker(
    # Engine或者其子类对象（这里是AsyncEngine）
    bind = async_engine,
    # Session类的代替（默认是Session类）
    class_=AsyncSession,
    # 是否在查找之前执行flush操作（默认是True）
    autoflush=True,
    # 控制是否在调用 session.commit() 后自动使所有 Session 中的对象过期
    expire_on_commit=False,
)


Base = declarative_base()


"""
    下面写自己的ORM模型类
"""


class Factor(Base):
    __tablename__ = "factors"
    id = Column(Integer, primary_key=True, autoincrement=True, index=True)
    name = Column(String(100), unique=True, nullable=False)  # 因子的名字，方便后续查找
    info = Column(Text, nullable=False)             # 因子的介绍
    content = Column(Text, nullable=False)          # 因子具体内容